// 路由的类型
import type { RouteRecordRaw } from 'vue-router'

function loadLocalRoutes() {
  // 1.动态获取所有的路由对象, 放到数组中
  // * 路由对象都在独立的文件中
  // * 从文件中将所有路由对象先读取数组中
  const localRoutes: RouteRecordRaw[] = []

  // 方式一：直接在 localRoutes 手动添加路由
  // 方式二：自动获取路由（推荐）

  // 读取 router/main 下面所有文件下面所有 ts 文件
  // 关于这个类型声明，默认情况下是 Record<string, unknown>
  const files: Record<string, any> = import.meta.glob('../router/main/**/*.ts', {
    eager: true
  })

  // 将获取的文件(对象)遍历，取出对应的路由对象
  for (const key in files) {
    const module = files[key]
    // modele 模块下面的 default 对象才是要拿的内容
    localRoutes.push(module.default)
  }

  return localRoutes
}

// 记录第一个路由
export let firstMenu: any = null

export function mapMenusToRoutes(userMenus: any[]) {
  // 1. 加载本地的路由
  const localRoutes = loadLocalRoutes()

  // 2. 根据传入的 userMenus 来匹配路由

  // 用来存储匹配到的路由
  const routes: RouteRecordRaw[] = []
  for (const menu of userMenus ?? []) {
    // 对应的路由在子目录中，所以要二次遍历
    for (const submenu of menu.children) {
      const route = localRoutes.find((item) => item.path === submenu.url)
      // 类型缩小
      if (route) {
        // 1.给route的顶层菜单增加重定向功能(但是只需要添加一次即可)
        // 先是查找看 routes 数组里面有没有对应 url ，没有就添加进来，并且对其重定向
        // 避免重复添加
        if (!routes.find((item) => item.path === menu.url)) {
          routes.push({ path: menu.url, redirect: route.path })
        }

        // 2.将二级菜单对应的路径
        routes.push(route)
      }
      // 当 firstMenu 为空时，并且匹配到第一个路由时
      if (!firstMenu && route) firstMenu = submenu
    }
  }
  return routes
}

// 路由映射到菜单
// 根据路径去匹配需要显示的菜单，在页面刷新时会根据当前的路径去匹配对应的菜单
// path 路径，userMenus 用户信息中的菜单
export function mapPathToMenu(path: String, userMenus: any[]) {
  for (const menu of userMenus ?? []) {
    for (const submenu of menu.children) {
      if (submenu.url === path) {
        return submenu
      }
    }
  }
}

// 面包屑内容的抽取
interface IBreadcrumbs {
  name: string
  path: string
}
export function mapPathToBreadcrumbs(path: string, userMenus: any[]) {
  // 1.定义面包屑
  const breadcrumbs: IBreadcrumbs[] = []

  // 2.遍历获取面包屑层级
  for (const menu of userMenus ?? []) {
    for (const submenu of menu.children) {
      if (submenu.url === path) {
        // 1.顶层菜单
        breadcrumbs.push({ name: menu.name, path: menu.url })
        // 2.匹配菜单
        breadcrumbs.push({ name: submenu.name, path: submenu.url })
      }
    }
  }
  // console.log(breadcrumbs)

  return breadcrumbs
}

// role页面=》树形菜单回显=》要遍历 多层数据里面 最底层的id（由于只要选中里面的，父级就会选中，所以不用父级的数据）
export function mapMenuListToIds(menuList: any[]) {
  const ids: number[] = []
  // 在内部再创建一个函数来实现递归
  function recurseGetId(menus: any[]) {
    for (const item of menus) {
      if (item.children) {
        recurseGetId(item.children)
      } else {
        ids.push(item.id)
      }
    }
  }
  recurseGetId(menuList)

  return ids
}

// 从菜单映射到按钮权限
// menuList 菜单的列表
export function mapMenusToPermissions(menuList: any[]) {
  const permissions: string[] = []
  // console.log(menuList)

  function recurseGetPermission(menus: any[]) {
    // console.log(menus)

    for (const item of menus ?? []) {
      if (item.type === 3) {
        permissions.push(item.permission)
      } else {
        recurseGetPermission(item.children ?? [])
      }
    }
  }
  recurseGetPermission(menuList)

  return permissions
}
